<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>Docker-微服务容器化开发探索 | HankChan&#39;s Blog</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接： Docker-微服务容器化开发探索 1.Docker与微服务1.1.微服务特点彼此独立：既然是一个独立的服务，那必然是一个完整的自治系统，不依赖外部的东西就能够提供服务。有自己一整套的完整的运行机制，有和外部通讯的标准化接口。它就是一个独立的服务，可以探测到其他服务彼此的存在。离开了其他个体，一样能够运转，只是功能比较单一。 原子化：作">
<meta property="og:type" content="article">
<meta property="og:title" content="Docker-微服务容器化开发探索">
<meta property="og:url" content="http://hexo.hankchan.cn/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/index.html">
<meta property="og:site_name" content="HankChan&#39;s Blog">
<meta property="og:description" content="由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接： Docker-微服务容器化开发探索 1.Docker与微服务1.1.微服务特点彼此独立：既然是一个独立的服务，那必然是一个完整的自治系统，不依赖外部的东西就能够提供服务。有自己一整套的完整的运行机制，有和外部通讯的标准化接口。它就是一个独立的服务，可以探测到其他服务彼此的存在。离开了其他个体，一样能够运转，只是功能比较单一。 原子化：作">
<meta property="og:updated_time" content="2017-05-26T03:00:54.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Docker-微服务容器化开发探索">
<meta name="twitter:description" content="由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接： Docker-微服务容器化开发探索 1.Docker与微服务1.1.微服务特点彼此独立：既然是一个独立的服务，那必然是一个完整的自治系统，不依赖外部的东西就能够提供服务。有自己一整套的完整的运行机制，有和外部通讯的标准化接口。它就是一个独立的服务，可以探测到其他服务彼此的存在。离开了其他个体，一样能够运转，只是功能比较单一。 原子化：作">
  
    <link rel="alternate" href="/atom.xml" title="HankChan&#39;s Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
  

</head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">HankChan&#39;s Blog</a>
      </h1>
      
        <h2 id="subtitle-wrap">
          <a href="/" id="subtitle">生活就像海洋</a>
        </h2>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://hexo.hankchan.cn"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/" class="article-date">
  <time datetime="2017-03-13T11:02:15.000Z" itemprop="datePublished">2017-03-13</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Docker/">Docker</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Docker-微服务容器化开发探索
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接："><a href="#由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接：" class="headerlink" title="由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接："></a>由于图片有些问题，所以顺便在文章开头先附上原稿的PDF链接：</h2><p> <a href="http://blog.hankchan.cn/wp-content/uploads/2017/03/Docker-微服务容器化开发探索.pdf" target="_blank" rel="external">Docker-微服务容器化开发探索</a></p>
<h1 id="1-Docker与微服务"><a href="#1-Docker与微服务" class="headerlink" title="1.Docker与微服务"></a>1.Docker与微服务</h1><h2 id="1-1-微服务特点"><a href="#1-1-微服务特点" class="headerlink" title="1.1.微服务特点"></a>1.1.微服务特点</h2><h4 id="彼此独立："><a href="#彼此独立：" class="headerlink" title="彼此独立："></a>彼此独立：</h4><p>既然是一个独立的服务，那必然是一个完整的自治系统，不依赖外部的东西就能够提供服务。有自己一整套的完整的运行机制，有和外部通讯的标准化接口。它就是一个独立的服务，可以探测到其他服务彼此的存在。离开了其他个体，一样能够运转，只是功能比较单一。</p>
<h4 id="原子化："><a href="#原子化：" class="headerlink" title="原子化："></a>原子化：</h4><p>作为一个微服务，一定是一个原子化的服务。也就是说服务不能再划分成更小的服务了。世界上的一些事物都是有原子构成的。它为什么能构成所有的物体，正是由于它足够的基础。如果一个服务还能划分成几个小的服务，那我们就不能称之为一个微服务，它其实可以通过几个微服务组合成的一个系统。</p>
<h4 id="组合和重构："><a href="#组合和重构：" class="headerlink" title="组合和重构："></a>组合和重构：</h4><p>如果是最原子的服务，那一定是没有任何用处的。微服务之所以神奇，在于它能快速的组合和重构。彼此组合成一个系统。系统里面所有的实体在概念上是对等的。因此它的结构相对简单化。是一种松散耦合的结构，这样的系统，往往具有更强的可扩展性和鲁棒性。</p>
<h2 id="1-2-Docker的作用"><a href="#1-2-Docker的作用" class="headerlink" title="1.2.Docker的作用"></a>1.2.Docker的作用</h2><p>在Docker出现之前，微服务架构虽然存在，但是实现的技术门槛很高。微服务要运行，首先需要一套执行的环境。这套环境不能对外部有依赖性。同时，执行环境的粒度又必须足够的小，这样才能称之为“微”，否则必然是对资源的巨大浪费。一个微服务可以跑在一台虚拟机上面，但是虚拟机粒度太大，即使最小的虚拟机，也至少也有1个核。服务一个用户的服务，显然用不了一个核。同时，虚拟机有没有一套方便的管理机制，能够快速的让这些服务之间能够组合和重构。Docker出现以后，我们看到了微服务的一个非常完美的运行环境。</p>
<h2 id="1-3-Docker特点"><a href="#1-3-Docker特点" class="headerlink" title="1.3. Docker特点"></a>1.3. Docker特点</h2><h4 id="独立性："><a href="#独立性：" class="headerlink" title="独立性："></a>独立性：</h4><p>一个容器就是一个完整的执行环境，不依赖外部任何的东西。</p>
<h4 id="细粒度："><a href="#细粒度：" class="headerlink" title="细粒度："></a>细粒度：</h4><p>一台物理机器可以同时运行成百上千个容器。其计算粒度足够的小。</p>
<h4 id="快速创建和销毁："><a href="#快速创建和销毁：" class="headerlink" title="快速创建和销毁："></a>快速创建和销毁：</h4><p>容器可以在秒级进行创建和销毁，非常适合服务的快速构建和重组。</p>
<h4 id="完善的管理工具："><a href="#完善的管理工具：" class="headerlink" title="完善的管理工具："></a>完善的管理工具：</h4><p>数量众多的容器编排管理工具，能够快速的实现 服务的组合和调度。</p>
<h2 id="1-4-去中心化的云服务"><a href="#1-4-去中心化的云服务" class="headerlink" title="1.4. 去中心化的云服务"></a>1.4. 去中心化的云服务</h2><p>去中心化的云服务，是一个非常典型的应用场景。什么是去中心化的云服务呢？这里做一个类比，譬如家里的供暖，可以采用集中化的供暖方式。由电厂或者钢铁厂统一提供供暖服务。当然，也有的家庭自己会建设一套中央空调系统进行供暖。云服务，也会有类似的趋势。目前云计算的发展比较低级。主要是以托管为主，因此大部分还是中心化的云服务。随着云计算的应用越来越垂直化，必然也会出现越来越多的去中心化的应用场景。</p>
<p>就拿个人云存储来举例。每个人都有一套个人的云的存储系统。这套系统运行在任意的提供“水和电”的基础云服务商的系统之上。并且可以任意在不同的服务商之间迁移和部署。不同的用户，可能位于不同的服务商之上。完全由自己控制的一套系统。每一套系统，都是一系列微小的服务组合而成。虽然底层也依赖基础云服务商，但是他们的作用更像水和电一样。</p>
<p>借助于这样的服务，用户能够快速的构建一套属于自己的系统。选购他们，就像在商店里面选购商品一样，拿回家，插上电就可以用了。</p>
<h1 id="2-Docker入门"><a href="#2-Docker入门" class="headerlink" title="2. Docker入门"></a>2. Docker入门</h1><h2 id="2-1-Docker基本概念"><a href="#2-1-Docker基本概念" class="headerlink" title="2.1. Docker基本概念"></a>2.1. Docker基本概念</h2><h3 id="2-1-1-镜像（Image）"><a href="#2-1-1-镜像（Image）" class="headerlink" title="2.1.1. 镜像（Image）"></a>2.1.1. 镜像（Image）</h3><p>我们都知道，操作系统分为内核和用户空间。对于Linux而言，内核启动后，会挂载root文件系统为其提供用户空间支持。而Docker镜像，就相当于是一个root文件系统。比如官方镜像ubuntu:14.04就包含了完整的一套Ubuntu 14.04最小系统的root文件系统。</p>
<p>Docker镜像是一个特殊的文件系统，除了提供容器运行时所需的程序、库、资源、配置等文件外，还包含了一些为运行时准备的一些配置参数（如匿名卷、环境变量、用户等）。镜像不包含任何动态数据，其内容在构建之后也不会被改变。</p>
<h4 id="关于分层存储"><a href="#关于分层存储" class="headerlink" title="关于分层存储"></a>关于分层存储</h4><p>由于镜像包含操作系统完整的root文件系统，其体积往往很庞大，因此Docker利用UnionFS技术，设计为分层存储的架构。严格意义上说，镜像并非就像是ISO文件一样的打包文件，镜像这个称呼是一个虚拟概念。实际上并非由一个文件组成的，而是由一组多个层次的文件系统组成。</p>
<p>基于分层存储，镜像可以更易于复用、定制。我们可以使用原有的镜像分层，在其基础上进一步添加新的层，定制自己所需要的内容，构建为新的镜像。</p>
<h3 id="2-1-2-容器（Container）"><a href="#2-1-2-容器（Container）" class="headerlink" title="2.1.2. 容器（Container）"></a>2.1.2. 容器（Container）</h3><p>容器的实质是进程，但是与直接在宿主机上执行的进程不同，容器进程运行在属于自己的独立命名空间，所以容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间等等。</p>
<p>举个例子来说，镜像与容器的关系，就像是面向对象语言中的类和实例的关系。容器基于镜像生成，镜像是静态的定义，容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。</p>
<h4 id="关于分层存储-1"><a href="#关于分层存储-1" class="headerlink" title="关于分层存储"></a>关于分层存储</h4><p>对于容器来说，同样使用的是分层存储，就是在每一个容器运行时，会以其对应的镜像为基础层，在该基础层上创建一个属于当前容器的存储层，这个层次可以成为容器存储层。容器存储层是为容器运行时读写用而准备的。</p>
<p>容器销毁时，容器存储层也会随着销毁。</p>
<h4 id="关于写数据"><a href="#关于写数据" class="headerlink" title="关于写数据"></a>关于写数据</h4><p>按照Docker最佳实践的要求，容器不应该向其存储层内写入任何数据，容器存储层要求保持无状态化。所有文件写入操作，都应该使用数据卷（Volume，其生存周期独立于容器）、或者绑定宿主目录。这样操作会直接对宿主发生读写，其性能和稳定性会更高。</p>
<h4 id="关于容器ID和容器Name"><a href="#关于容器ID和容器Name" class="headerlink" title="关于容器ID和容器Name"></a>关于容器ID和容器Name</h4><p>每一个容器启动后都会自动生成一个唯一的容器ID，是该容器的唯一标识，容器Name可以在创建容器时自定义。</p>
<p>可以通过容器ID或容器Name对容器执行启动、停止、删除等操作。</p>
<h3 id="2-1-3-仓库（Repository）"><a href="#2-1-3-仓库（Repository）" class="headerlink" title="2.1.3. 仓库（Repository）"></a>2.1.3. 仓库（Repository）</h3><p>镜像在构建完成后，可以很容易在当前的宿主机上运行，但是如果需要在其他服务器上运行该镜像，我们就需要一个集中的存储、分发镜像的服务，Docker Registry就是这样的一个服务。</p>
<p>一个Docker  Registry可以包含多个仓库（Repository）；每个仓库可以包含多个标签（Tag）；每个标签对应了一个镜像。</p>
<p>比如，一个仓库名包含同一个软件的不同版本的镜像，标签就常用于对应软件的版本号。可以通过&lt;仓库名&gt;:&lt;标签&gt;的格式来指定具体是这个软件哪个版本的镜像。Docker默认将latest作为默认的标签。</p>
<p>以运行AliTomcat基础环境的镜像为例，如：alitomcat:1.0，alitomcat是仓库名字，1.0是其版本号。如果忽略1.0，就将被视为：alitomcat:latest。</p>
<p>另外，仓库名又常常以两段式路径形式出现，比如：yangyitech/alitomcat:1.0。其中前缀是用户名，具体形式通常与提供Registry服务的提供商有关。</p>
<h1 id="3-Docker环境搭建"><a href="#3-Docker环境搭建" class="headerlink" title="3. Docker环境搭建"></a>3. Docker环境搭建</h1><h2 id="3-1-基础环境"><a href="#3-1-基础环境" class="headerlink" title="3.1. 基础环境"></a>3.1. 基础环境</h2><p>系统要求：</p>
<p>Docker 最低支持 CentOS 7。（应该是CentOS7对Docker支持更良好）</p>
<p>Docker 需要安装在 64 位的平台，并且内核版本不低于 3.10（使用<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">uname -r</div></pre></td></tr></table></figure></p>
<p>命令查看）。 CentOS-7满足最低内核的要求，但由于内核版本比较低，部分功能（如overlay2存储层驱动）无法使用，并且部分功能可能不太稳定。</p>
<h4 id="现有服务器资源"><a href="#现有服务器资源" class="headerlink" title="现有服务器资源"></a>现有服务器资源</h4><p>阿里云私有云CentOS-7.2 服务器</p>
<p>CPU 8核 内存 16G 数据盘100G</p>
<h4 id="内网IP"><a href="#内网IP" class="headerlink" title="内网IP"></a>内网IP</h4><p>10.153.216.19</p>
<p>10.153.216.13</p>
<h4 id="登陆用户"><a href="#登陆用户" class="headerlink" title="登陆用户"></a>登陆用户</h4><p>root</p>
<h4 id="密码："><a href="#密码：" class="headerlink" title="密码："></a>密码：</h4><p>（略）</p>
<h2 id="3-2-安装Docker服务"><a href="#3-2-安装Docker服务" class="headerlink" title="3.2. 安装Docker服务"></a>3.2. 安装Docker服务</h2><h3 id="第一步：使用官方脚本安装Docker"><a href="#第一步：使用官方脚本安装Docker" class="headerlink" title="第一步：使用官方脚本安装Docker"></a>第一步：使用官方脚本安装Docker</h3><p>Docker官方提供了安装运行脚本，通过运行以下命令可以自动安装Docker运行环境：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# curl -sSL https://get.docker.com/ | sh</div></pre></td></tr></table></figure>
<h3 id="第二步：启动Docker服务"><a href="#第二步：启动Docker服务" class="headerlink" title="第二步：启动Docker服务"></a>第二步：启动Docker服务</h3><p>执行命令启动Docker引擎：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# systemctl enable docker</div><div class="line"></div><div class="line">[root@xxxx]# systemctl start docker</div></pre></td></tr></table></figure>
<h3 id="第三步：建立docker用户组"><a href="#第三步：建立docker用户组" class="headerlink" title="第三步：建立docker用户组"></a>第三步：建立docker用户组</h3><p>默认情况下，docker命令会使用<a href="https://en.wikipedia.org/wiki/Unix_domain_socket" target="_blank" rel="external">Unix socket</a>与Docker引擎通讯。而只有root用户和docker组的用户才可以访问 Docker 引擎的Unix socket。出于安全考虑，一般Linux系统上不会直接使用root用户。因此，更好地做法是将需要使用 docker 的用户加入docker用户组。</p>
<p>首先查看是否存在docker用户组：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# grep docker /etc/group</div></pre></td></tr></table></figure>
<p>如果不存在，首先需要创建docker用户组：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# groupadd docker</div></pre></td></tr></table></figure>
<h3 id="第四步：将非root用户加入group组"><a href="#第四步：将非root用户加入group组" class="headerlink" title="第四步：将非root用户加入group组"></a>第四步：将非root用户加入group组</h3><p>如前面所说，出于安全考虑，不要直接使用root用户。</p>
<p>首先创建一个用户user：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# useradd user</div></pre></td></tr></table></figure>
<p>将用户加入docker组：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# usermod -aG docker user</div></pre></td></tr></table></figure>
<p>使用命令验证Docker：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker -v</div></pre></td></tr></table></figure>
<h3 id="验证通过，安装完毕！"><a href="#验证通过，安装完毕！" class="headerlink" title="验证通过，安装完毕！"></a>验证通过，安装完毕！</h3><h1 id="4-Docker基础操作命令"><a href="#4-Docker基础操作命令" class="headerlink" title="4. Docker基础操作命令"></a>4. Docker基础操作命令</h1><h2 id="4-1-查看本地镜像"><a href="#4-1-查看本地镜像" class="headerlink" title="4.1. 查看本地镜像"></a>4.1. 查看本地镜像</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker images</div></pre></td></tr></table></figure>
<h2 id="4-2-搜索目标镜像"><a href="#4-2-搜索目标镜像" class="headerlink" title="4.2. 搜索目标镜像"></a>4.2. 搜索目标镜像</h2><p>如，搜索tomcat镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker search tomcat</div></pre></td></tr></table></figure>
<h2 id="4-3-安装目标镜像"><a href="#4-3-安装目标镜像" class="headerlink" title="4.3. 安装目标镜像"></a>4.3. 安装目标镜像</h2><p>如，安装官方tomcat镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker pull tomcat</div></pre></td></tr></table></figure>
<p>此处未指定版本号，默认为latest版本。</p>
<h2 id="4-4-镜像导出"><a href="#4-4-镜像导出" class="headerlink" title="4.4. 镜像导出"></a>4.4. 镜像导出</h2><p>保存镜像到一个tar包：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker save ubuntu:latest &amp;gt; ubuntu_save.tar</div></pre></td></tr></table></figure>
<h2 id="4-5-镜像导入"><a href="#4-5-镜像导入" class="headerlink" title="4.5. 镜像导入"></a>4.5. 镜像导入</h2><p>加载一个tar包格式的镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker load &amp;lt; ubuntu_save.tar</div></pre></td></tr></table></figure>
<h2 id="4-6-退出镜像-容器"><a href="#4-6-退出镜像-容器" class="headerlink" title="4.6. 退出镜像/容器"></a>4.6. 退出镜像/容器</h2><p>在使用交互模式进入镜像或者容器的文件系统后，通过以下命令退出：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"># exit</div></pre></td></tr></table></figure>
<p>在使用该方式退出容器的同时，容器也将会停止运行。</p>
<h2 id="4-7-查看运行态容器"><a href="#4-7-查看运行态容器" class="headerlink" title="4.7. 查看运行态容器"></a>4.7. 查看运行态容器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker ps</div></pre></td></tr></table></figure>
<h2 id="4-8-查看最近容器"><a href="#4-8-查看最近容器" class="headerlink" title="4.8. 查看最近容器"></a>4.8. 查看最近容器</h2><p>可以使用以下命令顺序查看最近操作的容器列表：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker ps -l</div></pre></td></tr></table></figure>
<h2 id="4-9-查看所有容器"><a href="#4-9-查看所有容器" class="headerlink" title="4.9. 查看所有容器"></a>4.9. 查看所有容器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker ps -a</div></pre></td></tr></table></figure>
<h2 id="4-10-启动容器"><a href="#4-10-启动容器" class="headerlink" title="4.10. 启动容器"></a>4.10. 启动容器</h2><p>根据容器名启动运行容器：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker start swift-edas-web</div></pre></td></tr></table></figure>
<p>根据容器ID启动运行容器：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker start 94e2</div></pre></td></tr></table></figure>
<p>在使用容器ID操作容器的时候，不一定需要使用完整的容器ID，只需要前几位能够区别于其他容器ID的字符即可，如94e2就是该容器ID的前4位，足以在所有容器中识别到该容器。</p>
<h2 id="4-11-终止容器"><a href="#4-11-终止容器" class="headerlink" title="4.11. 终止容器"></a>4.11. 终止容器</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker stop swift-edas-web</div></pre></td></tr></table></figure>
<h2 id="4-12-查看容器日志"><a href="#4-12-查看容器日志" class="headerlink" title="4.12. 查看容器日志"></a>4.12. 查看容器日志</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker logs &amp;lt;containerID&amp;gt;</div></pre></td></tr></table></figure>
<h2 id="4-13-容器生成镜像"><a href="#4-13-容器生成镜像" class="headerlink" title="4.13. 容器生成镜像"></a>4.13. 容器生成镜像</h2><p>当需要对镜像或者容器添加层次时候，可以在完成添加后，退出容器，然后通过以下命名生成新的镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker commit &lt;containerID&gt; &lt;New Image Name&gt;</div></pre></td></tr></table></figure>
<h1 id="5-EDAS-HSF应用容器化"><a href="#5-EDAS-HSF应用容器化" class="headerlink" title="5. EDAS-HSF应用容器化"></a>5. EDAS-HSF应用容器化</h1><p>在这里以阿里云EDAS-HSF分布式服务应用swift-edas项目为例子，简单介绍如果实现分布式服务应用的容器化实现。</p>
<h2 id="5-1-搭建Ali-Tomcat镜像"><a href="#5-1-搭建Ali-Tomcat镜像" class="headerlink" title="5.1. 搭建Ali-Tomcat镜像"></a>5.1. 搭建Ali-Tomcat镜像</h2><p>由于EDAS-HSF应用的部署有一个Ali-Tomcat只能部署一个应用的限制，为了达到服务容器化运行的目的，我们基于Ali-Tomcat创建一个应用运行镜像。</p>
<h3 id="第一步：选择基础镜像"><a href="#第一步：选择基础镜像" class="headerlink" title="第一步：选择基础镜像"></a>第一步：选择基础镜像</h3><p>我们在选择CentOS作为基础镜像，从官方镜像仓库拉取CentOS的镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker pull centos</div></pre></td></tr></table></figure>
<p>（未指定版本号，默认为最新版本latest）</p>
<p>拉取成功后，可以查看本地镜像已经存在centos的镜像。</p>
<h3 id="第二步：获取镜像必须的安装包"><a href="#第二步：获取镜像必须的安装包" class="headerlink" title="第二步：获取镜像必须的安装包"></a>第二步：获取镜像必须的安装包</h3><p>镜像创建需要用到的有taobao-tomcat的tgz安装包和java-jdk的rpm安装包。</p>
<p>如果是远程服务器，可以通过rz命令，将本地的文件上传到服务器中。</p>
<p>使用rz命令，需要使用以下命令先安装rz：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# yum install lrzsz -y</div></pre></td></tr></table></figure>
<p>这里我选择在/opt/目录下创建一个文件夹setuppackages作为一些安装包文件的存放路径。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# cd /opt/</div><div class="line"></div><div class="line">[root@xxxx]# mkdir setuppackages</div></pre></td></tr></table></figure>
<p>进入到该目录后通过rz命令将taobao-tomcat.tgz和jdk的安装包上传到服务器上。</p>
<h3 id="第三步：运行基础镜像"><a href="#第三步：运行基础镜像" class="headerlink" title="第三步：运行基础镜像"></a>第三步：运行基础镜像</h3><p>使用交互模式进入CentOS镜像，同时需要在启动时挂载本地安装包所在目录到镜像中：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -i -t -v /opt/setuppackages/:/mnt/software/ centos /bin/bash</div></pre></td></tr></table></figure>
<h3 id="第四步：安装JavaJDK"><a href="#第四步：安装JavaJDK" class="headerlink" title="第四步：安装JavaJDK"></a>第四步：安装JavaJDK</h3><p>进入上一步中挂载的目录/mnt/software中，执行安装jdk安装包：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# rpm -ivh jdk-8u121-linux-x64.rpm</div></pre></td></tr></table></figure>
<p>rpm安装方式的JDK默认安装在/usr/java目录下。</p>
<p>使用<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]ls /usr/java/</div></pre></td></tr></table></figure></p>
<p>命令获取JavaHome全路径，这里是/usr/java/jdk1.8.0_121</p>
<p>配置JDK环境变量：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# vi /etc/profile</div></pre></td></tr></table></figure>
<p>在该文本最后加入如下内容：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">export JAVA_HOME=/usr/java/jdk1.8.0_121</div><div class="line"></div><div class="line">export JRE_HOME=/usr/java/jdk1.8.0_121/jre</div><div class="line"></div><div class="line">export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin</div><div class="line"></div><div class="line">export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib</div></pre></td></tr></table></figure></p>
<p>保存退出当前文件。</p>
<p>使改变生效：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# source /etc/profile</div></pre></td></tr></table></figure>
<h3 id="第五步：安装Ali-Tomcat"><a href="#第五步：安装Ali-Tomcat" class="headerlink" title="第五步：安装Ali-Tomcat"></a>第五步：安装Ali-Tomcat</h3><p>首先复制taobao-tomcat安装包到/usr/local目录下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# cp taobao-tomcat-7.0.59.tgz /usr/local</div></pre></td></tr></table></figure>
<p>进入/usr/local并解压：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# cd /usr/local</div><div class="line"></div><div class="line">[root@xxxx]# tar -zxvf taobao-tomcat-7.0.59.tgz</div><div class="line"></div><div class="line">[root@xxxx]# rm taobao-tomcat-7.0.59.tgz</div></pre></td></tr></table></figure>
<p>为taobao-tomcat安装根目录更改名字为alitomcat：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# mv taobao-tomcat-7.0.59 alitomcat</div></pre></td></tr></table></figure>
<h3 id="第六步：配置运行环境变量"><a href="#第六步：配置运行环境变量" class="headerlink" title="第六步：配置运行环境变量"></a>第六步：配置运行环境变量</h3><p>设置环境变量：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# vi ~/.bashrc</div></pre></td></tr></table></figure>
<p>加入以下内容，保存退出：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">export JAVA_HOME=/usr/java/jdk1.8.0_121</div><div class="line"></div><div class="line">export PATH=$PATH:$JAVA_HOME/bin</div></pre></td></tr></table></figure>
<p>使修改生效：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]## source ~/.bashrc</div></pre></td></tr></table></figure>
<h3 id="第七步：编写运行脚本"><a href="#第七步：编写运行脚本" class="headerlink" title="第七步：编写运行脚本"></a>第七步：编写运行脚本</h3><p>创建脚本文件：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# touch /root/run.sh</div><div class="line"></div><div class="line">[root@xxxx]# vi /root/run.sh</div></pre></td></tr></table></figure>
<p>加入内容如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">#!/bin/bash</div><div class="line"></div><div class="line">source ~/.bashrc</div><div class="line"></div><div class="line">sh /usr/local/alitomcat/bin/catalina.sh run</div></pre></td></tr></table></figure>
<p>为脚本添加执行权限：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# chmod u+x /root/run.sh</div></pre></td></tr></table></figure>
<h3 id="第八步：退出当前镜像"><a href="#第八步：退出当前镜像" class="headerlink" title="第八步：退出当前镜像"></a>第八步：退出当前镜像</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# exit</div></pre></td></tr></table></figure>
<h3 id="第九步：创建新镜像"><a href="#第九步：创建新镜像" class="headerlink" title="第九步：创建新镜像"></a>第九步：创建新镜像</h3><p>获取刚刚运行的容器ID：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker ps -a</div></pre></td></tr></table></figure>
<p>可以看到最近的一个容器ID，如：a78d9b71d4e8</p>
<p>创建镜像：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker commit a78d alitomcat:0.2</div></pre></td></tr></table></figure>
<p>查看镜像库：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker images</div></pre></td></tr></table></figure>
<p>可以看到已经存在创建成功的alitomcat:0.2镜像。</p>
<h2 id="5-2-应用部署"><a href="#5-2-应用部署" class="headerlink" title="5.2. 应用部署"></a>5.2. 应用部署</h2><p>我们选择两个web应用edas-service和edas-web的war包用于部署。</p>
<p>在部署过程中，我们使用挂载数据卷方式将应用war包挂载到镜像中的alitomcat应用部署目录。</p>
<h3 id="第一步：创建应用部署目录"><a href="#第一步：创建应用部署目录" class="headerlink" title="第一步：创建应用部署目录"></a>第一步：创建应用部署目录</h3><p>在/opt/目录下创建一个目录software用于挂载部署目录：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# mkdir software</div></pre></td></tr></table></figure>
<p>另外，需要进入software目录，分别创建用于存放edas-service和edas-web的部署目录。</p>
<h3 id="第二步：加入taobao-hsf-sar包"><a href="#第二步：加入taobao-hsf-sar包" class="headerlink" title="第二步：加入taobao-hsf.sar包"></a>第二步：加入taobao-hsf.sar包</h3><p>由于HSF应用的运行需要依赖于taobao-hsf.sar包，且与应用在同一个目录下，为此需要将taobao-hsf.sar分别放在/opt/software/edas-service和/opt/software/edas-web目录下。</p>
<h3 id="第三步：部署应用war包"><a href="#第三步：部署应用war包" class="headerlink" title="第三步：部署应用war包"></a>第三步：部署应用war包</h3><p>将war包分别存放到edas-web和edas-service目录下</p>
<h3 id="第四步：启动应用容器"><a href="#第四步：启动应用容器" class="headerlink" title="第四步：启动应用容器"></a>第四步：启动应用容器</h3><p>这是应用容器化运行的最后一步，我们需要在启动命令中设置的项目有：</p>
<ol>
<li><p>容器以守护模式运行：-d</p>
</li>
<li><p>在容器的hosts文件中加入HSF的配置中心地址：–add-host=[域名]:[IP]</p>
</li>
<li><p>指定容器映射端口：-p [宿主IP]:[容器内的应用IP]</p>
</li>
<li><p>设定一个有意义的容器名称：–name [容器名称]</p>
</li>
<li><p>挂载部署目录：-v [宿主目录]:[容器内目录]</p>
</li>
<li><p>指定启动脚本，如此处的/root/run.sh<br>启动命令如下所示：</p>
</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run --add-host=jmenv.tbsite.net:10.148.16.72 -d -p 8080:8080 -v /opt/software/edas-web/:/usr/local/alitomcat/deploy/ --name edas-web yangyi/alitomcat:0.2 /root/run.sh</div></pre></td></tr></table></figure>
<h3 id="部署完毕！"><a href="#部署完毕！" class="headerlink" title="部署完毕！"></a>部署完毕！</h3><p>查看运行中的容器：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker ps</div></pre></td></tr></table></figure>
<h2 id="5-3-容器应用监控"><a href="#5-3-容器应用监控" class="headerlink" title="5.3. 容器应用监控"></a>5.3. 容器应用监控</h2><h3 id="5-3-1-单机容器应用监控"><a href="#5-3-1-单机容器应用监控" class="headerlink" title="5.3.1. 单机容器应用监控"></a>5.3.1. 单机容器应用监控</h3><p>​ cAdvisor为Docker容器用户提供了了解运行时容器资源使用和性能特征的工具。cAdvisor的容器抽象基于Google的lmctfy容器栈，因此原生支持Docker容器并能够“开箱即用”地支持其他的容器类型。cAdvisor部署为一个运行中的daemon，它会收集、聚集、处理并导出运行中容器的信息。这些信息能够包含容器级别的资源隔离参数、资源的历史使用状况、反映资源使用和网络统计数据完整历史状况的柱状图。</p>
<p>cAdvisor图形化监控工具是免费的，并且还开源。另外，它的资源消耗也比较低。但是，它有它的局限性，它只能监控一个Docker主机。</p>
<h4 id="获取cAdvisor镜像"><a href="#获取cAdvisor镜像" class="headerlink" title="获取cAdvisor镜像"></a>获取cAdvisor镜像</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker pull google/cadvisor</div></pre></td></tr></table></figure>
<h4 id="启动运行cAdvisor"><a href="#启动运行cAdvisor" class="headerlink" title="启动运行cAdvisor"></a>启动运行cAdvisor</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -p 8888:8080 --detach=true --name cadvisor google/cadvisor:latest</div></pre></td></tr></table></figure>
<p>接下来就可以通过<a href="http://10.153.216.13:8888/" target="_blank" rel="external"><u>http://10.153.216.19:8888/</u></a> 访问图形化监控界面。</p>
<h3 id="5-3-2-集群容器应用监控"><a href="#5-3-2-集群容器应用监控" class="headerlink" title="5.3.2. 集群容器应用监控"></a>5.3.2. 集群容器应用监控</h3><p>在集群环境下，可以使用cAdvisor+ InfluxDB+grafana方案对应用进行监控。</p>
<p>其中InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写，无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。</p>
<p>Grafana是一款开源的监控绘图工具。可以实时收集、存储、显示时间序列类型的数据。</p>
<h4 id="第一步：下载镜像"><a href="#第一步：下载镜像" class="headerlink" title="第一步：下载镜像"></a>第一步：下载镜像</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker pull tutum/influxdb</div><div class="line"></div><div class="line">[root@xxxx]# docker pull grafana/grafana</div><div class="line"></div><div class="line">[root@xxxx]# docker pull google/cadvisor</div></pre></td></tr></table></figure>
<p>（在前面单机监控已经下载）</p>
<h4 id="第二步：启动InfluxDB"><a href="#第二步：启动InfluxDB" class="headerlink" title="第二步：启动InfluxDB"></a>第二步：启动InfluxDB</h4><p>启动InfluxDB容器，以守护模式运行，配置端口映射，并且暴露8090和8099端口，将该容器命名为influxsrv，启动命令如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 --name influxsrv tutum/influxdb</div></pre></td></tr></table></figure>
<h4 id="第三步：安装cAdvisor专用的数据库"><a href="#第三步：安装cAdvisor专用的数据库" class="headerlink" title="第三步：安装cAdvisor专用的数据库"></a>第三步：安装cAdvisor专用的数据库</h4><p>启动InfluxDB之后，需要进入容器中配置为cAdvisor服务的数据库：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker exec -it influxsrv /bin/bash</div></pre></td></tr></table></figure>
<p>在容器内运行：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# influx</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[]# CREATE DATABASE cadvisor</div><div class="line"></div><div class="line">[]# use cadvisor</div><div class="line"></div><div class="line">[]# CREATE USER “root” WITH PASSWORD ‘root’ WITH ALL PRIVILEGES</div></pre></td></tr></table></figure>
<p>退出</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# exit</div></pre></td></tr></table></figure>
<p>####第四步：启动cAdvisor容器</p>
<p>启动cAdvisor容器，这个cAdvisor容器需要绑定到前面的InfluxDB容器上：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -v/:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -p 8888:8080 --detach=true --link influxsrv:influxsrv --name cadvisor google/cadvisor:latest -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086</div></pre></td></tr></table></figure>
<p>在集群中的其他机器上只需要部署一个cAdvisor容器即可，启动时设定-storage_driver_host为安装了InfluxDB的宿主机IP和端口号，另外这里不再需要使用–link参数，启动命令如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -v/:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro -p 8888:8080 --detach=true --name cadvisor google/cadvisor:latest -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=10.153.216.19:8086</div></pre></td></tr></table></figure>
<p>另外，可以通过各个主机的cAdvisor端口访问单机的监控图形化界面，如：<a href="http://10.153.216.13:8888/" target="_blank" rel="external"><u>http://10.153.216.19:8888/</u></a> <a href="http://10.153.216.13:8888/" target="_blank" rel="external"><u>http://10.153.216.13:8888/</u></a></p>
<h4 id="第五步：启动Grafana容器"><a href="#第五步：启动Grafana容器" class="headerlink" title="第五步：启动Grafana容器"></a>第五步：启动Grafana容器</h4><p>启动grafana容器：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@xxxx]# docker run -d -p 3000:3000 -e INFLUXDB_HOST=10.153.216.19 -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana/grafana</div></pre></td></tr></table></figure>
<h4 id="第六步：访问集群监控界面"><a href="#第六步：访问集群监控界面" class="headerlink" title="第六步：访问集群监控界面"></a>第六步：访问集群监控界面</h4><p>最后通过<a href="http://10.153.216.19:3000访问集群监控界面，缺省用户及密码都是admin。" target="_blank" rel="external">http://10.153.216.19:3000访问集群监控界面，缺省用户及密码都是admin。</a></p>
<p>通过简单的图表项目配置即可查看监控信息。</p>
<p># </p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://hexo.hankchan.cn/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/" data-id="cj359k3tu0000fwv7ty81wr3i" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
  
    <a href="/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">DRDS结合Mybatis解决方案与规范</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Docker/">Docker</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/">Eclipse</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/Mybatis/">Mybatis</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/Spring/">Spring</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Eclipse/分布式/">分布式</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Git/">Git</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/">Linux</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/Nginx/">Nginx</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/">Mybatis</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/Spring/">Spring</a><ul class="category-list-child"><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/Spring/SpringMVC/">SpringMVC</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Mybatis/SpringMVC/">SpringMVC</a></li></ul></li><li class="category-list-item"><a class="category-list-link" href="/categories/Nginx/">Nginx</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Spring/">Spring</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringMVC/">SpringMVC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/分布式/">分布式</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/日志管理/">日志管理</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/未分类/">未分类</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/03/">三月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/01/">一月 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/10/">十月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/09/">九月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/08/">八月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/07/">七月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/06/">六月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/05/">五月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/04/">四月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/03/">三月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/02/">二月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/01/">一月 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/12/">十二月 2015</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2017/03/13/docker-e5-be-ae-e6-9c-8d-e5-8a-a1-e5-ae-b9-e5-99-a8-e5-8c-96-e5-bc-80-e5-8f-91-e6-8e-a2-e7-b4-a2/">Docker-微服务容器化开发探索</a>
          </li>
        
          <li>
            <a href="/2017/01/20/drds-e7-bb-93-e5-90-88mybatis-e8-a7-a3-e5-86-b3-e6-96-b9-e6-a1-88-e4-b8-8e-e8-a7-84-e8-8c-83/">DRDS结合Mybatis解决方案与规范</a>
          </li>
        
          <li>
            <a href="/2017/01/03/springmvc-thymeleaf-e5-bc-80-e5-8f-91-e6-8c-87-e5-8d-97-demo/">SpringMVC-Thymeleaf-开发指南-Demo</a>
          </li>
        
          <li>
            <a href="/2016/10/16/nginx-e4-bb-a3-e7-90-86-e6-9c-8d-e5-8a-a1-e5-99-a8-e6-96-b9-e5-bc-8f-e8-a7-a3-e5-86-b3-e5-ae-9e-e9-99-85-e5-bc-80-e5-8f-91-e4-b8-adajax-e8-af-b7-e6-b1-82-e7-9a-84-e8-b7-a8-e5-9f-9f-e9-97-ae-e9-a2-98/">Nginx代理服务器方式解决实际开发中Ajax请求的跨域问题</a>
          </li>
        
          <li>
            <a href="/2016/10/11/e5-b7-a5-e5-8e-82-e6-a8-a1-e5-bc-8f-e5-92-8c-e5-8d-95-e4-be-8b-e6-a8-a1-e5-bc-8f-e7-bb-93-e5-90-88-e5-ba-94-e7-94-a8-e7-9a-84-e5-9c-ba-e6-99-af-e6-80-9d-e8-80-83/">工厂模式和单例模式结合应用的场景思考</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2017 Hank Chan<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>

  </div>
</body>
</html>